# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Four-Leaf Bank Module                                 #
#                               ## ##       #
# Geschreven voor de Four-Leaf Bank               #         #
#                               ## ##       #
# Door Dennis Bogers                                #
#                                       #
# Met deze module is het mogelijk om de Four-Leaf Bank database te beheren. #
# Het is mogelijk om de klantenlijst te bekijken, klanten toe te voegen     #
# en om hun saldo aan te passen.                        #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #



# # #    Initialisatie van benodigde modules en variabelen    # # #


# Importeer benodigde modules
import MySQLdb
import obzen

# Settings #
host = obzen.decode("kYZH4k9fxAlxaXXluYmwDgF85AghHPNSTkO00=")
user = obzen.decode("lYpt8eGp21eRjl9xdYNeZgoYxNHCDT8j==")
password = obzen.decode("mmv8tVwDjiXRvf8wGyNtNtxtEK")
db = obzen.decode("lYpt8eGp21eRjl9xdYmUHeGFl3grHPNSUBOkZ=")

# Verbind met database #

try: # Probeer te verbinden
    db = MySQLdb.connect(host, user, password, db)
    c = db.cursor()

except: # Als het niet lukt, sluit af
    print "\nEr kan geen verbinding worden gemaakt met de server van Four-Leaf Bank\n"
    exit()

# Creeer bank klasse

class bank:

    # # #   Functies   # # #

    # # Functie 1 - login() # #

    # Vraag om naam, rekeningnummer en wachtwoord, als het juist is, return True
    def login(self, rnummer, naam, userhash):

        try:
            # Check login info tegen database info
            if c.execute("SELECT password FROM users WHERE naam='" + naam + "' AND nummerid='" + rnummer + "'"):

                ww = c.fetchone()
                ww = "".join(ww)

                if ww == userhash:

                    return True
            else:

                return False
        except:
            print "\nError: Er is iets mis gegaan tijdens de login, probeer het opnieuw!\n"



    # # Functie 2 - listclient() # #

    # Geef een lijst van alle klanten #
    def listclients(self):

        try:
            print "\n"

            # Draai een query en sla resultaten op
            c.execute("SELECT nummerid, naam, password, saldo FROM users")
        
            # Geef resultaten weer
            rows = c.fetchall()

            for item in rows:
                print "\n\n".join(item)

            print "\n"

        except:
            print "\nError: Kon klantenlijst niet afdrukken. Waarschijnlijk is de verbindign verbroken!\n"

    # Einde van Functie 2 #


    # # Functie 3 - addclient(nummerid, naam, userhash) # #

    # Voeg een klant toe #
    def addclient(self, nummerid, naam, userhash):

        try:
            # Voeg informatie aan database toe
            c.executemany(
                """INSERT INTO users (nummerid, naam, password, saldo)
                    VALUES (%s, %s, %s, %s)""",
                    [
                    (nummerid, naam, userhash, 0),
                    ] )
        except:
            print "\nError: Kon klant niet toevoegen, waarschijnlijk is de verbinding verbroken!\n"

    # Einde van Functie 3 #


    # # Functie 4 - editsaldo(rnummer, nsaldo) # #

    # Bewerk het saldo van een klant #
    def editsaldo(self, rnummer, nsaldo):

        try:
            c.execute("UPDATE users SET saldo='" + nsaldo + "' WHERE nummerid='" + rnummer + "'")
        
        except:
            print "\nError: Kon saldo niet aanpassen, waarschijnlijk is de verbinding verbroken!\n"

    
    # Einde van Functie 4 #


    # # Functie 5 - checksaldo(nummerid) # #

    # Return het saldo van nummerid
    def checksaldo(self, nummerid):

        try:
            c.execute("SELECT saldo FROM users WHERE nummerid='" + nummerid + "'")
            saldo = c.fetchone()
            saldo = "".join(saldo)

            return int(saldo)

        except:
            print "\nError: Kon saldo niet ophalen! Waarschijnlijk is de verbinding met de server verbroken.\n"


    # Einde van Functie 5 #


    # # Functie 6 - log(nummerid, mesg) # #

    # Log gebeurtenissen in de database
    def log(self, nummerid, mesg):

        try:
            c.executemany(
                    """INSERT INTO logs (nummerid, datumtijd, log)
                    VALUES (%s, NOW(), %s)""",
                    [
                    (nummerid, mesg)
                    ] )
        except:
            print "\nError: Kon log niet wegschrijven!\n"

    # Einde Functie 6 #

    # # Functie 7 - readlogs()

    # Lees alle logs
    def readlogs(self):

        try:
            print "\n"

            # Draai een query en sla resultaten op
            c.execute("SELECT nummerid, DATE_FORMAT(datumtijd, '%d-%m-%Y om %H:%i'), log FROM logs")
        
            # Geef resultaten weer
            rows = c.fetchall() 
    
            for item in rows:
                print "\n\n".join(item)

            print "\n"
        
        except:
            print "\nError: Kon logs niet ophalen!\n"

    # Einde Functie 7 #

    # # Functie 8 - readuserlog(nummerid)
    def readuserlog(self, nummerid):

        try: 
            
            # Draai een query en sla resultaten op
            c.execute("SELECT DATE_FORMAT(datumtijd, '%d-%m-%Y om %H:%i'), log FROM logs WHERE nummerid='" + nummerid + "'")
        
            # Geef resultaten weer
            rows = c.fetchall()
            a = ""
            for item in rows:
                a = a + "\n".join(item)
                a = a + "\n"
            return a

        except:
            return "\nError: Kon logs niet ophalen. Waarschijnlijk is de verbinding verbroken.\n"

    # Einde Functie 8 #

    # # Functie 9 - transfer(v_id, o_id, bedrag) - v_id = verzender rekeningnummer, o_id is ontvanger rekeningnummer # #

    # Maak bedrag over aan o_id van v_id #

    def transfer(self, v_id, o_id, bedrag):

        if int(bedrag) > self.checksaldo(v_id):
            
            print "\nUw saldo is maar "+ str(self.checksaldo(v_id)) +" patan en u probeerde "+ bedrag+ " patan over te maken!"
            return 3

        elif int(bedrag) < 1:

            print "\nU moet een bedrag invoeren dat minstens 1 patan of meer is!"

            return 2

        # Bewaar oude saldos tijdelijk
        try:
            v_osaldo = str(self.checksaldo(v_id))
            o_osaldo = str(self.checksaldo(o_id))

        except:

            print "\nOnjuist rekeningnummer ingevoerd.\n"
            return 1

        try: # Verander het saldo van de verzender naar huidig saldo - bedrag #
            nsaldo = str(self.checksaldo(v_id) - int(bedrag))
            c.execute("UPDATE users SET saldo='" + nsaldo + "' WHERE nummerid='" + v_id + "'")

            # Verander het saldo van de ontvanger naar huidig saldo + bedrag #
            nsaldo = str(self.checksaldo(o_id) + int(bedrag))
            c.execute("UPDATE users SET saldo='" + nsaldo + "' WHERE nummerid='" + o_id + "'")
        
        except: # In het geval dat het niet lukt, zet oude saldos terug en geef een error weer

            try:
                c.execute("UPDATE users SET saldo='" + v_osaldo + "' WHERE nummerid='" + v_id + "'")
                c.execute("UPDATE users SET saldo='" + o_osaldo + "' WHERE nummerid='" + o_id + "'")

            except:

                print "\nKon oude saldos niet terugzetten na fout\n"
                return 0 # Error 0, kon oude saldos niet terugzetten!              

            return False

        return True
    

    # # Functie 10 - delclient(self, nummerid)
    def delclient(self, nummerid):

        try:
            c.execute("DELETE FROM users WHERE nummerid='" + nummerid + "'")
            return True

        except:
            print "\nError: Kon rekeningnummer niet verwijderen! Waarschijnlijk klopt het rekeningnummer niet!\n"
            return False
        
# # #   Einde van Bank Module  # # #
